#include "wifi.h"


 const char *WIFI_TAG = "WIFI_CONFIG";

bool is_wifi_connected(void)
{
    wifi_ap_record_t ap_info;
    if (esp_wifi_sta_get_ap_info(&ap_info) == ESP_OK) {
        ESP_LOGI(WIFI_TAG, "Connected to AP: %s", ap_info.ssid);
        return true;
    }
    return false;
}

static void wifi_event_handler(void* arg, esp_event_base_t event_base,
                              int32_t event_id, void* event_data)
{
    if (event_base == WIFI_EVENT) {
        switch(event_id) {
            case WIFI_EVENT_STA_START:
                ESP_LOGI(WIFI_TAG, "WiFi STA started");              
                esp_wifi_connect();
                break;
            case WIFI_EVENT_STA_CONNECTED:
                ESP_LOGI(WIFI_TAG, "WiFi connected");
                update_status("WiFi已连接");
                tcp_server_task();
                break;
            case WIFI_EVENT_STA_DISCONNECTED:
                ESP_LOGI(WIFI_TAG, "WiFi disconnected");
                update_status("WiFi已断开");
                listen_sock = -1; // 重置监听套接字，确保重新连接后重新创建
                ESP_LOGI(WIFI_TAG, "WiFi断开连接，尝试立即重连");
                esp_err_t err = esp_wifi_connect();
                
                if (err != ESP_OK)
                {
                    ESP_LOGE(WIFI_TAG, "重连WiFi失败: %s", esp_err_to_name(err));
                }
                break;
            default:
                ESP_LOGI(WIFI_TAG, "未知WiFi事件: %ld", event_id);
                break;
        }
    }
} 
void force_wifi_rf_priority(void) {
    // 提高 WiFi 任务优先级（高于默认的 1）
    vTaskPrioritySet(xTaskGetHandle("wifi"), 3);
    // 禁用 WiFi 省电模式
    esp_wifi_set_ps(WIFI_PS_NONE);
    // 最大化发射功率
    esp_wifi_set_max_tx_power(78);
    ESP_LOGI("WIFI", "通过公开 API 完成 WiFi 优先级配置");
}
void wifi_init(void) {
    esp_event_loop_create_default();
    esp_netif_create_default_wifi_sta();
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    esp_wifi_init(&cfg);
    esp_wifi_set_mode(WIFI_MODE_STA);
    // 关键：强制设置 WiFi 射频优先级
    force_wifi_rf_priority();
    // 注册WiFi和IP事件处理程序
    esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL);
}

void set_wifi_sta(void) {
    wifi_config_t wifi_config_t = {
        .sta = {
            .threshold.authmode = WIFI_AUTH_WPA2_PSK,
        },
    };
    //直接从nvs中加载，防止掉电丢失
    load_config_from_nvs();
    printf("wifi_config.ssid:%s,wifi_config.password:%s\n", wifi_config.ssid, wifi_config.password);
    strcpy((char*)wifi_config_t.sta.ssid, (char*)wifi_config.ssid);
    strcpy((char*)wifi_config_t.sta.password, (char*)wifi_config.password);
    esp_wifi_set_mode(WIFI_MODE_STA);
    esp_wifi_set_config(WIFI_IF_STA, &wifi_config_t);
    esp_wifi_start();
    printf("connect to ap SSID:%s password:%s\n", wifi_config_t.sta.ssid, wifi_config_t.sta.password);
}

void set_static_ip_sta(void) { 
    //直接从nvs中加载，防止掉电丢失
    // load_config_from_nvs();
    // 获取已经创建的STA网络接口
    esp_netif_t *sta_netif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF");
    
    if (sta_netif == NULL) {
        ESP_LOGE(WIFI_TAG, "STA netif not found");
        return;
    }
    // 配置静态IP信息
    esp_netif_ip_info_t ip_info = {0};
    
    // 设置IP地址 (192.168.1.100)
    ip_info.ip.addr = ipaddr_addr(network_config.ip);
    // 设置网关 (192.168.1.1)
    ip_info.gw.addr = ipaddr_addr(network_config.gateway);
    // 设置子网掩码 (255.255.255.0)
    ip_info.netmask.addr = ipaddr_addr(network_config.subnet);
    
    // 停止DHCP客户端并应用静态IP配置
    esp_netif_dhcpc_stop(sta_netif);
    esp_netif_set_ip_info(sta_netif, &ip_info);
    
    ESP_LOGI(WIFI_TAG, "Static IP set: %s", inet_ntoa(ip_info.ip));

}